home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / share / gtk-2.0 / demo / menus.c < prev    next >
Encoding:
C/C++ Source or Header  |  2006-04-25  |  6.4 KB  |  214 lines

  1. /* Menus
  2.  *
  3.  * There are several widgets involved in displaying menus. The
  4.  * GtkMenuBar widget is a menu bar, which normally appears horizontally
  5.  * at the top of an application, but can also be layed out vertically. 
  6.  * The GtkMenu widget is the actual menu that pops up. Both GtkMenuBar 
  7.  * and GtkMenu are subclasses of GtkMenuShell; a GtkMenuShell contains 
  8.  * menu items (GtkMenuItem). Each menu item contains text and/or images 
  9.  * and can be selected by the user.
  10.  *
  11.  * There are several kinds of menu item, including plain GtkMenuItem,
  12.  * GtkCheckMenuItem which can be checked/unchecked, GtkRadioMenuItem
  13.  * which is a check menu item that's in a mutually exclusive group,
  14.  * GtkSeparatorMenuItem which is a separator bar, GtkTearoffMenuItem
  15.  * which allows a GtkMenu to be torn off, and GtkImageMenuItem which
  16.  * can place a GtkImage or other widget next to the menu text.
  17.  *
  18.  * A GtkMenuItem can have a submenu, which is simply a GtkMenu to pop
  19.  * up when the menu item is selected. Typically, all menu items in a menu bar
  20.  * have submenus.
  21.  *
  22.  * GtkUIManager provides a higher-level interface for creating menu bars
  23.  * and menus; while you can construct menus manually, most people don't
  24.  * do that. There's a separate demo for GtkUIManager.
  25.  * 
  26.  */
  27.  
  28. #include <gtk/gtk.h>
  29. #include <gdk/gdkkeysyms.h>
  30.  
  31. #include <stdio.h>
  32.  
  33. static GtkWidget *
  34. create_menu (gint     depth,
  35.          gboolean tearoff)
  36. {
  37.   GtkWidget *menu;
  38.   GtkWidget *menuitem;
  39.   GSList *group;
  40.   char buf[32];
  41.   int i, j;
  42.  
  43.   if (depth < 1)
  44.     return NULL;
  45.  
  46.   menu = gtk_menu_new ();
  47.   group = NULL;
  48.  
  49.   if (tearoff)
  50.     {
  51.       menuitem = gtk_tearoff_menu_item_new ();
  52.       gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
  53.       gtk_widget_show (menuitem);
  54.     }
  55.  
  56.   for (i = 0, j = 1; i < 5; i++, j++)
  57.     {
  58.       sprintf (buf, "item %2d - %d", depth, j);
  59.       menuitem = gtk_radio_menu_item_new_with_label (group, buf);
  60.       group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
  61.  
  62.       gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
  63.       gtk_widget_show (menuitem);
  64.       if (i == 3)
  65.     gtk_widget_set_sensitive (menuitem, FALSE);
  66.  
  67.       gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (depth - 1, TRUE));
  68.     }
  69.  
  70.   return menu;
  71. }
  72.  
  73. static void
  74. change_orientation (GtkWidget *button,
  75.                     GtkWidget *menubar)
  76. {
  77.   GtkWidget *parent;
  78.   GtkWidget *box = NULL;
  79.  
  80.   parent = gtk_widget_get_parent (menubar);
  81.  
  82.   if (GTK_IS_VBOX (parent))
  83.     {
  84.       box = gtk_widget_get_parent (parent);
  85.  
  86.       g_object_ref (menubar);
  87.       gtk_container_remove (GTK_CONTAINER (parent), menubar);
  88.       gtk_container_add (GTK_CONTAINER (box), menubar);
  89.       gtk_box_reorder_child (GTK_BOX (box), menubar, 0);
  90.       g_object_unref (menubar);
  91.       g_object_set (menubar, 
  92.             "pack-direction", GTK_PACK_DIRECTION_TTB,
  93.             NULL);
  94.     }
  95.   else
  96.     {
  97.       GList *children, *l;
  98.  
  99.       children = gtk_container_get_children (GTK_CONTAINER (parent));
  100.       for (l = children; l; l = l->next)
  101.     {
  102.       if (GTK_IS_VBOX (l->data))
  103.         {
  104.           box = l->data;
  105.           break;
  106.         }
  107.     }
  108.       g_list_free (children);
  109.  
  110.       g_object_ref (menubar);
  111.       gtk_container_remove (GTK_CONTAINER (parent), menubar);
  112.       gtk_container_add (GTK_CONTAINER (box), menubar);
  113.       gtk_box_reorder_child (GTK_BOX (box), menubar, 0);
  114.       g_object_unref (menubar);
  115.       g_object_set (menubar, 
  116.             "pack-direction", GTK_PACK_DIRECTION_LTR,
  117.             NULL);
  118.     }
  119. }
  120.  
  121. GtkWidget *
  122. do_menus (GtkWidget *do_widget)
  123. {
  124.   static GtkWidget *window = NULL;
  125.   GtkWidget *box;
  126.   GtkWidget *box1;
  127.   GtkWidget *box2;
  128.   GtkWidget *button;
  129.   
  130.   if (!window)
  131.     {
  132.       GtkWidget *menubar;
  133.       GtkWidget *menu;
  134.       GtkWidget *menuitem;
  135.       GtkAccelGroup *accel_group;
  136.       
  137.       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  138.       gtk_window_set_screen (GTK_WINDOW (window),
  139.                  gtk_widget_get_screen (do_widget));
  140.       g_signal_connect (window, "destroy",
  141.             G_CALLBACK(gtk_widget_destroyed), &window);
  142.       g_signal_connect (window, "delete-event",
  143.             G_CALLBACK (gtk_true), NULL);
  144.       
  145.       accel_group = gtk_accel_group_new ();
  146.       gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
  147.  
  148.       gtk_window_set_title (GTK_WINDOW (window), "menus");
  149.       gtk_container_set_border_width (GTK_CONTAINER (window), 0);
  150.       
  151.             
  152.       box = gtk_hbox_new (FALSE, 0);
  153.       gtk_container_add (GTK_CONTAINER (window), box);
  154.       gtk_widget_show (box);
  155.  
  156.       box1 = gtk_vbox_new (FALSE, 0);
  157.       gtk_container_add (GTK_CONTAINER (box), box1);
  158.       gtk_widget_show (box1);
  159.       
  160.       menubar = gtk_menu_bar_new ();
  161.       gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
  162.       gtk_widget_show (menubar);
  163.       
  164.       menu = create_menu (2, TRUE);
  165.       
  166.       menuitem = gtk_menu_item_new_with_label ("test\nline2");
  167.       gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
  168.       gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
  169.       gtk_widget_show (menuitem);
  170.       
  171.       menuitem = gtk_menu_item_new_with_label ("foo");
  172.       gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (3, TRUE));
  173.       gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
  174.       gtk_widget_show (menuitem);
  175.  
  176.       menuitem = gtk_menu_item_new_with_label ("bar");
  177.       gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (4, TRUE));
  178.       gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
  179.       gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
  180.       gtk_widget_show (menuitem);
  181.       
  182.       box2 = gtk_vbox_new (FALSE, 10);
  183.       gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
  184.       gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
  185.       gtk_widget_show (box2);
  186.  
  187.       button = gtk_button_new_with_label ("Flip");
  188.       g_signal_connect (button, "clicked",
  189.             G_CALLBACK (change_orientation), menubar);
  190.       gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
  191.       gtk_widget_show (button);
  192.  
  193.       button = gtk_button_new_with_label ("Close");
  194.       g_signal_connect_swapped (button, "clicked",
  195.                 G_CALLBACK(gtk_widget_destroy), window);
  196.       gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
  197.       GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
  198.       gtk_widget_grab_default (button);
  199.       gtk_widget_show (button);
  200.     }
  201.  
  202.   if (!GTK_WIDGET_VISIBLE (window))
  203.     {
  204.       gtk_widget_show (window);
  205.     }
  206.   else
  207.     {
  208.       gtk_widget_destroy (window);
  209.       window = NULL;
  210.     }
  211.  
  212.   return window;
  213. }
  214.